package br.com.swp.campestre.session;

import java.util.Date;
import java.util.List;

import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.web.RequestParameter;
import org.jboss.seam.international.StatusMessage;
import org.jboss.seam.international.StatusMessages;
import org.jboss.seam.log.Log;
import org.jboss.seam.persistence.HibernateSessionProxy;

import br.com.swp.campestre.entity.Cidade;
import br.com.swp.campestre.entity.ClientePF;

@Stateful
@Name("ClientePFBean")
@Scope(ScopeType.CONVERSATION)
public class ClientePFBean implements ClientePFLocal {

	@Logger
	private Log log;

	@In
	StatusMessages statusMessages;
	
	private String cpf;
	
	private String nome;
	
    private Date dataNascimento;
    
    @RequestParameter
    private Long idCliente;
    
    @In(required=false , create=true)
    CidadeList cidadeList;


	@In(required = true) @Out(required=false)
	private ClientePF clientePF;
	
    //@DataModel
	//@Out(scope = ScopeType.CONVERSATION, required = false)
	private List<ClientePF> clientesPF;
	
    private Cidade cidade;

	
	@PersistenceContext
	private EntityManager entityManager;

	@In(create = true, required = false)
	private HibernateSessionProxy hibernateSession;

	@Create
	public void init() {

	}
	
	
	
	@End(beforeRedirect = false)
	public void clientePFBean() throws IllegalStateException {

		entityManager.persist(clientePF);

	}


		
	//@Begin(join = true)
	@End
	public void novoCliente() throws IllegalStateException {
		
		Criteria crt = hibernateSession.createCriteria(ClientePF.class);
		
		if (clientePF.getCpf() != null && !clientePF.getCpf().equals("")) {
			crt.add(Restrictions.eq("cpf", clientePF.getCpf()));
		}
		
		if ((clientePF.getCpf() != null && !clientePF.getCpf().equals(""))) {
			clientesPF = crt.list();
		}
		
		if(clientesPF != null && clientesPF.size() >= 1 && clientePF.getId() == null ){
			statusMessages.add(StatusMessage.Severity.ERROR, "Cliente jah foi cadastrado");
		} else {
			//entityManager.persist(clientePF);	
	    	//Cidade c = entityManager.find(Cidade.class, clientePF.getCidade().getId());
	    	//clientePF.setCidade(c);

//			Cidade _c = clientePF.getCidade();
//			_c = entityManager.find(Cidade.class,_c.getId());
//			clientePF.setCidade(_c);
//			clientePF = entityManager.merge(clientePF);
			hibernateSession.saveOrUpdate(clientePF);
			statusMessages.add(StatusMessage.Severity.INFO, "Cliente cadastrado com sucesso");

		}
		
	}
	
//    @Factory("clientesPF")
	public void pesquisaCliente() {
		clientePF = null;

		Criteria crt = hibernateSession.createCriteria(ClientePF.class);

		if (cpf != null && !cpf.equals("")) {
			crt.add(Restrictions.eq("cpf", cpf));
		}
		
		if (dataNascimento != null) {
			crt.add(Restrictions.eq("dataNascimento", dataNascimento));			
		}
		
		if (nome != null) {
			crt.add(Restrictions.like("nome", "%"+nome+"%").ignoreCase());
		}
		
		if ((cpf != null && !cpf.equals(""))||(nome != null)||(dataNascimento != null) ) {
			clientesPF = crt.list();
		}
		
		if(clientesPF != null && clientesPF.size() == 1 ){
			clientePF = clientesPF.get(0);
		} else if(clientesPF == null || clientesPF.size() == 0 ) {
			statusMessages.add("Cliente nao encontrado");
		} else {
			clientePF =  null;
		}
		
	}
	
	@Begin(join = true)
	public void editar(){
    	log.info("idCliente: " + idCliente);
    	
//    	clientePF = (ClientePF)entityManager.find(ClientePF.class, idCliente);

    	if(idCliente == null)return;
    	
    	for (ClientePF _clientePF : clientesPF) {
			if(_clientePF.getId().equals(idCliente)){
				clientePF = _clientePF;
				break;
			}
		}
    	
    	if(cidadeList != null && clientePF != null && clientePF.getCidade() != null && clientePF.getCidade().getUf() != null){
    		cidadeList.setUf(clientePF.getCidade().getUf());
    		cidadeList.buscaCidade(cidadeList.getUf());
    	}
	
	}


	@Destroy
	@Remove
	public void destroy() {
		//cpf = null;

	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public ClientePF getClientePF() {
		return clientePF;
	}

	public void setClientePF(ClientePF clientePF) {
		this.clientePF = clientePF;
	}

	public void setClientesPF(List<ClientePF> clientesPF) {
		this.clientesPF = clientesPF;
	}

	public List<ClientePF> getClientesPF() {
		return clientesPF;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getNome() {
		return nome;
	}

//	@ManyToOne
	public Cidade getCidade() {
		return cidade;
	}

	public void setCidade(Cidade cidade) {
		this.cidade = cidade;
	}


	public void setDataNascimento(Date dataNascimento) {
		this.dataNascimento = dataNascimento;
	}


	public Date getDataNascimento() {
		return dataNascimento;
	}





}
